package ipfms.stripes.action;

import able.stripes.JSP;

import com.google.inject.Inject;
import ipfms.dao.KodJenisPenggunaDAO;
import ipfms.dao.KodPenggunaPerananDAO;
import ipfms.dao.PenggunaDAO;
import ipfms.dao.PenggunaPerananDAO;
import ipfms.manager.UserManager;
import ipfms.model.InfoAudit;
import ipfms.model.KodJenisPengguna;
import ipfms.model.KodPenggunaPeranan;
import ipfms.model.Pengguna;
import ipfms.model.PenggunaPeranan;
import ipfms.stripes.BaseActionBean;
import java.util.List;
import net.sourceforge.stripes.action.DefaultHandler;
import net.sourceforge.stripes.action.RedirectResolution;
import net.sourceforge.stripes.action.Resolution;
import net.sourceforge.stripes.action.StreamingResolution;
import net.sourceforge.stripes.action.UrlBinding;
import org.apache.log4j.Logger;

@UrlBinding("/uam_register")
public class RegisterUserActionBean extends BaseActionBean {

    private Pengguna pengguna;
    private PenggunaPeranan pp;
    private Pengguna p;
    @Inject
    PenggunaDAO penggunaDAO;
    @Inject
    KodPenggunaPerananDAO kodPenggunaPerananDAO;
    @Inject
    UserManager userManager;
    @Inject
    KodJenisPenggunaDAO kodJenisPenggunaDAO;
    private static final Logger logger = Logger.getLogger(RegisterUserActionBean.class);
    private List<Pengguna> senaraiPguna;
    private List<PenggunaPeranan> senaraiPgunaPeranan;
    private String passwordGenerate = "";
    public static final int password_Length = 8;
    protected static java.util.Random random = new java.util.Random();
    protected static char[] goodChar = {'a', 'b', 'c', 'd', 'e', 'f', 'g',
        'h', 'i', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v',
        'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
        'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
        'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '_', '-', '@'};

    @DefaultHandler
    public Resolution showForm() {
        p = new Pengguna();
        senaraiPguna = userManager.findAll();
        return new JSP("uam/reg_user.jsp");
    }

    public Resolution showForm2() {
        p = getContext().getCurrentUser();
        return new JSP("uam/change_pwd.jsp");
    }

    public Resolution savePguna() {
        try {
            Pengguna pguna = penggunaDAO.findById(p.getIdPengguna());
            pengguna = getContext().getCurrentUser();
            InfoAudit info = new InfoAudit();
            if (pguna == null) {
                pguna = new Pengguna();
                pguna.setActive('Y');
                pguna.setPassword(p.getPassword());
                pguna.setNama(p.getNama());
                KodJenisPengguna kjp = kodJenisPenggunaDAO.findById(p.getKodJenisPengguna().getCode());
                pguna.setKodJenisPengguna(kjp);
                pguna.setIdPengguna(p.getIdPengguna());
                info.setDimasukOleh(pengguna);
                info.setTarikhMasuk(new java.util.Date());
                pguna.setInfoAufit(info);
                userManager.updatePengguna(pguna);
                addSimpleMessage("Successful");
            }
        } catch (Exception ex) {
            logger.error(ex.getMessage(), ex);
        }
        return showForm();
    }

    public Resolution janaPassword() {
        String result = "";
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < password_Length; i++) {
            sb.append(goodChar[random.nextInt(goodChar.length)]);
        }
        passwordGenerate = sb.toString();
        result = passwordGenerate;
        return new StreamingResolution("text/plain", result);
    }

    public Resolution deletePguna() {
        String idPengguna = getContext().getRequest().getParameter("idPengguna");
        if (idPengguna != null) {
            p = penggunaDAO.findById(idPengguna);
            if (p != null) {
                userManager.deletePengguna(p);
            }
        }
        return new RedirectResolution(RegisterUserActionBean.class, "showForm");
    }

    public Resolution showEditRole() {
        String idPengguna = getContext().getRequest().getParameter("idPengguna");
        if (idPengguna != null) {
            p = penggunaDAO.findById(idPengguna);
            senaraiPgunaPeranan = userManager.findByrole(idPengguna);
        }

        return new JSP("uam/add_role.jsp").addParameter("popup", "true");
    }

    public Resolution addRole() {
        String idPengguna = getContext().getRequest().getParameter("idPengguna");
        String peranan = getContext().getRequest().getParameter("pp.peranan.code");
        pengguna = getContext().getCurrentUser();
        InfoAudit info = new InfoAudit();
        p = penggunaDAO.findById(idPengguna);
        pp = userManager.findByIDAndRole(p.getIdPengguna(), peranan);
        if (pp == null) {
            pp = new PenggunaPeranan();
            pp.setPengguna(p);
            KodPenggunaPeranan kpp = kodPenggunaPerananDAO.findById(peranan);
            pp.setPeranan(kpp);
            info.setDimasukOleh(pengguna);
            info.setTarikhMasuk(new java.util.Date());
            pp.setInfoAudit(info);
            userManager.savePenggunaPeranan(pp);
            addSimpleMessage("Success add Role");
        } else {
            addSimpleError("Duplicate Role");
        }
        return new RedirectResolution(RegisterUserActionBean.class, "showForm");
    }

    public Resolution deletePeranan() {
        String idPengguna = getContext().getRequest().getParameter("idPengguna");
        String peranan = getContext().getRequest().getParameter("peranan");
        if (idPengguna != null) {
            p = penggunaDAO.findById(idPengguna);
            pp = userManager.findByIDAndRole(p.getIdPengguna(), peranan);
            if (pp != null) {
                userManager.deletePeranan(pp);
            }
        }
        return new RedirectResolution(RegisterUserActionBean.class, "showEditRole").addParameter("idPengguna", idPengguna);
    }

    public Pengguna getPengguna() {
        return pengguna;
    }

    public void setPengguna(Pengguna pengguna) {
        this.pengguna = pengguna;
    }

    public List<Pengguna> getSenaraiPguna() {
        return senaraiPguna;
    }

    public void setSenaraiPguna(List<Pengguna> senaraiPguna) {
        this.senaraiPguna = senaraiPguna;
    }

    public Pengguna getP() {
        return p;
    }

    public void setP(Pengguna p) {
        this.p = p;
    }

    public PenggunaPeranan getPp() {
        return pp;
    }

    public void setPp(PenggunaPeranan pp) {
        this.pp = pp;
    }

    public List<PenggunaPeranan> getSenaraiPgunaPeranan() {
        return senaraiPgunaPeranan;
    }

    public void setSenaraiPgunaPeranan(List<PenggunaPeranan> senaraiPgunaPeranan) {
        this.senaraiPgunaPeranan = senaraiPgunaPeranan;
    }
}
